/**
 * 
 */
package br.com.livraria.dao.impl;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import br.com.livraria.dao.AbstractDao;
import br.com.livraria.dao.LivroDao;
import br.com.livraria.vo.Autor;
import br.com.livraria.vo.Editora;
import br.com.livraria.vo.Livro;

/**
 * @author Jeferson
 *
 */
public class LivroDaoImpl extends AbstractDao implements LivroDao {

	/* (non-Javadoc)
	 * @see br.com.livraria.dao.LivroDao#incluir(br.com.livraria.vo.Livro)
	 */
	@Override
	public void incluir(Livro livro) {
		try {
			Connection con = open();
			
			PreparedStatement preparedStatement =
					con.prepareStatement("INSERT INTO livro (titulo, genero, data_lancamento, autor_id, editora_id) VALUES (?, ?, ?, ?, ?)");
			
			preparedStatement.setString(1, livro.getTitulo());
			preparedStatement.setString(2, livro.getGenero());
			preparedStatement.setDate(3, new Date(livro.getDataLancamento().getTime()));
			preparedStatement.setInt(4, livro.getAutor().getId());
			preparedStatement.setInt(5, livro.getEditora().getId());
			
			preparedStatement.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			close();
		}
	}

	/* (non-Javadoc)
	 * @see br.com.livraria.dao.LivroDao#alterar(br.com.livraria.vo.Livro)
	 */
	@Override
	public void alterar(Livro livro) {
		try {
			Connection con = open();
			
			PreparedStatement preparedStatement =
					con.prepareStatement("UPDATE livro SET titulo = ?, genero = ?, data_lancamento = ?, autor_id = ?, editora_id = ?  WHERE id = ? ");
			
			preparedStatement.setString(1, livro.getTitulo());
			preparedStatement.setString(2, livro.getGenero());
			preparedStatement.setDate(3, new Date(livro.getDataLancamento().getTime()));
			preparedStatement.setInt(4, livro.getAutor().getId());
			preparedStatement.setInt(5, livro.getEditora().getId());
			preparedStatement.setInt(6, livro.getId());
			
			preparedStatement.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			close();
		 }
		}
	@Override
	public void excluir(Integer id) {
		try {
			Connection con = open();
			
			PreparedStatement preparedStatement =
					con.prepareStatement(" DELETE FROM Livro WHERE id = ? ");
			
			preparedStatement.setInt(1, id);
			
			preparedStatement.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			close();
		}
	}
	@Override
	public Livro consultarPorId(Integer id) {
		Livro livro = new Livro();
		try {
			Connection con = open();
			PreparedStatement pst = con.prepareStatement("SELECT * FROM livro WHERE id = ?");
			
			pst.setInt(1, id);
					
			ResultSet rs = pst.executeQuery();
			
			while (rs.next()) {
				livro.setId(rs.getInt("id"));
				livro.setTitulo(rs.getString("titulo"));
				livro.setGenero(rs.getString("genero"));
				livro.setDataLancamento(rs.getDate("data_lancamento"));
				Autor a = new Autor();
				a.setId(rs.getInt("autor_id"));
				livro.setAutor(a);
			    
				Editora e = new Editora();
				e.setId(rs.getInt("editora_id"));
				livro.setEditora(e);
			
			
			}
			
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			close();
		}
		
		return livro;
	}

	/* (non-Javadoc)
	 * @see br.com.livraria.dao.LivroDao#consultarPorNome(java.lang.String)
	 */
	@Override
	public List<Livro> consultarPorNome(String nome) {
		// TODO Auto-generated method stub
		return null;
	}

	/* (non-Javadoc)
	 * @see br.com.livraria.dao.LivroDao#consultarPorEditora(java.lang.Integer)
	 */
	@Override
	public List<Livro> consultarPorEditora(Integer idEditora) {
		List<Livro> listaLivros = new ArrayList<Livro>();
		try {
			Connection con = open();
			PreparedStatement pst = con.prepareStatement("SELECT * FROM livro WHERE editora_id = ? ");
			pst.setInt(1, idEditora);
					
			ResultSet rs = pst.executeQuery();
			
			while (rs.next()) {
				Livro l = new Livro();
				l.setId(rs.getInt("id"));
				l.setDataLancamento(rs.getDate("data_lancamento"));
				l.setGenero(rs.getString("genero"));
				l.setTitulo(rs.getString("titulo"));
				
				listaLivros.add(l);
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			close();
		}
		
		return listaLivros;
	}

	/* (non-Javadoc)
	 * @see br.com.livraria.dao.LivroDao#consultarPorAutor(java.lang.Integer)
	 */
	@Override
	public List<Livro> consultarPorAutor(Integer idAutor) {
		
		List<Livro> listaLivros = new ArrayList<Livro>();
		try {
			Connection con = open();
			PreparedStatement pst = con.prepareStatement("SELECT * FROM livro WHERE autor_id = ? ");
			pst.setInt(1, idAutor);
					
			ResultSet rs = pst.executeQuery();
			
			while (rs.next()) {
				Livro l = new Livro();
				l.setId(rs.getInt("id"));
				l.setDataLancamento(rs.getDate("data_lancamento"));
				l.setGenero(rs.getString("genero"));
				l.setTitulo(rs.getString("titulo"));
				
				listaLivros.add(l);
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			close();
		}
		
		return listaLivros;
	}

	@Override
	public List<Livro> listarTodos() {
			List<Livro> listaLivros = new ArrayList<Livro>();
			try {
				Connection con = open();
				Statement statement = con.createStatement();
				ResultSet rs = statement.executeQuery("SELECT * FROM livro");
				
				while (rs.next()) {
					Livro a = new Livro();
					a.setId(rs.getInt("id"));
					a.setTitulo(rs.getString("titulo"));
					a.setGenero(rs.getString("genero"));
					a.setDataLancamento(rs.getDate("data_lancamento"));
					listaLivros.add(a);
				}
				
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				close();
			}
			
			return listaLivros;
		}
}
